package cn.lingyangwl.agile.model.enums;

import cn.lingyangwl.framework.tool.core.exception.BizException;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;
import java.util.Objects;

/**
 * @author shenguangyang
 */
@Getter
@AllArgsConstructor
public enum ConfigKeyEnum {
    DEFAULT("default",false, false),
    /**
     * 微信小程序
     */
    WX_MA("wx_ma",false, true),
    /**
     * 微信公众号
     */
    WX_MP("wx_mp",false, true),
    /**
     * 企业微信应用
     */
    WX_CP("wx_cp",false, true),

    /**
     * 钉钉
     */
    DINGTALK("dingtalk",false, true),

    /**
     * gitee第三方配置
     */
    GITEE("gitee",false, true),

    USER_REGISTER("sys.user.registerUser",true, false),

    /**
     * 网站设置
     */
    WEB_SITE("website",true, false),

    /**
     * 短信配置
     */
    // 阿里短信
    SMS_ALIYUN("sms_aliyun",false, true),
    // 聚美短信(用于个人测试使用)
    SMS_JUMEI("sms_jumei",false, true),
    // 腾讯云
    SMS_TENCENT("sms_tencent",false, true),

    /**
     * 邮件配置
     */
    // 腾讯邮箱
    EMAIL_TENCENT("email_tencent",false, true),
    // 网易邮箱
    EMAIL_163("email_163",false, true),

    /**
     * 推送到本系统
     */
    PUSH_SYSTEM_PC("push_system_pc",false, false),

    /**
     * 文件存储配置
     */
    // 自己搭建minio存储服务器
    STORAGE_MINIO("storage_minio",false, true),
    // 阿里云存储
    STORAGE_ALIYUN("storage_aliyun",false, true),
    // 腾讯与存储
    STORAGE_TENCENT("storage_tencent",false, true),
    // 七牛云存储
    STORAGE_QINIU("storage_qiniu",false, true),

    /**
     * 版权设置
     */
    COPYRIGHT("copyright", true, false),

    PUSH_APP("push_app", false, false),
    ;

    /**
     * 如果为空, 则等于key
     */
    private final String key;
    /**
     * 能匿名访问吗?
     */
    private final Boolean canAnonymousAccess;

    /**
     * 是否为敏感数据
     */
    private final Boolean isSensitive;

    public static ConfigKeyEnum of(String key, boolean isCheck) {
        ConfigKeyEnum configKey = Arrays.stream(ConfigKeyEnum.values())
                .filter(e -> e.getKey().equals(key))
                .findFirst().orElse(null);
        if (Objects.isNull(configKey) && isCheck) {
            throw new BizException("该配置键值 {} 尚未被定义", key);
        }
        return configKey;
    }

    public static ConfigKeyEnum of(String key) {
        return of( key, false);
    }

    public static ConfigKeyEnum ofAndCheck(String key) {
        return of(key, true);
    }

    public static void checkExistKey(String key) {
        Arrays.stream(values()).filter(e -> e.getKey().equals(key)).findFirst()
                .orElseThrow(() -> new BizException("不存在 {} 配置", key));
    }

    public void checkCanAnonymousAccess() {
        if (!canAnonymousAccess) {
            throw new BizException("无权限访问");
        }
    }
}
